/**
 * @file extraPwm.h
 * @author your name (you@domain.com)
 * @brief 扩展指令：脉冲输出调制脉冲,与硬件强相关
 * @version 0.1
 * @date 2025-08-11
 *
 * @copyright Copyright (c) 2025
 *
 */
#ifndef EXTRA_PWM_H
#define EXTRA_PWM_H
#include "stm32f4xx_hal.h"
#include "stm32f407xx.h"
#include "stm32f4xx_hal_tim.h"
#include "xmzTypeDefine.h"
#include <stdint.h>
// #define PWM_NUM 2 // 目前sic1000主控只有两路pwm输出
#define TYPE_PWM_OUTPUT 0x01
#define TYPE_PTO_OUTPUT 0x02
typedef uint8_t HW_PWM;
enum PWM_TIME_BASE { PWM_TIME_BASE_MS = 0, PWM_TIME_BASE_US };
enum PWM_CH {
  PWM_CH_1 = 0,
  PWM_CH_2,
};
enum PWM_STATUS {
  PWM_STATUS_NOERROR    = 0x0000, //!< 无错误
  PWM_STATUS_ERR_CH_NUM = 0x80A1, //!< PWM的硬件标识符无效
  PWM_STATUS_ERR_NOT_ON = 0x80D0, //!< CPU 硬件配置中没有启用PWM
};
typedef struct {
  HW_PWM pwm;    //!< 脉冲发生器硬件id
  Bool   enable; //!< true:使能，false:禁止
  Bool   busy;   //!< 通常为false
  Word   status; //!< PWM_STATUS
} CTRL_PWM_S;
enum PTO_STATUS {
  PTO_STATUS_NOERROR    = 0x0000, //!< 无错误
  PTO_STATUS_REON       = 0x8090, //!< 硬件ID的脉冲发生器已经在使用
  PTO_STATUS_EXREGION   = 0x8091, //!< 超出frequency范围
  PTO_STATUS_ERR_CH_NUM = 0x80A1, //!< PWM的硬件标识符无效
  PTO_STATUS_ERR_NOT_ON = 0x80D0, //!< CPU 硬件配置中没有启用PTO
};
typedef struct {
  Bool req;         //!< EQ=1：将脉冲发生器的频率设置为 FREQUENCY 的值
                    //!< REQ=1 和 FREQUENCY=0：禁用脉冲发生器
                    //!< REQ=0：脉冲发生器无变化
  HW_PWM pto;       //!< 脉冲发生器的硬件标识符
  UDInt  frequency; //!< 待输出的脉冲序列频率（单位为 Hz
  Bool   done;      //!< 状态参数，可具有以下值：
                    //!< 0：作业尚未启动，或仍在执行过程中
                    //!< 1：作业已经成功完成
  Bool busy;        //!< 处理状态 通常为false
  Bool error;       //!< 状态参数 0：无错误 1：指令执行过程中发生错误。
  Word status;      //!< PTO_STATUS
} CTRL_PTO_S;
typedef struct {
  uint8_t pwm_pto; //!< 1:PWM,2:PTO
  /*PWM配置*/
  uint8_t  time_base;     //!< 时间基 ms,us-目前只支持us
  uint16_t pulse_width;   //!< 脉冲宽度 1/100 1/1000 1/100000
  uint32_t cycle_time;    //!< 周期时间，循环时间
  uint16_t start_pulse_w; //!< 开始脉冲宽度
  uint8_t  is_active;     //!< 是否启用
  /*PTO配置*/
  uint32_t total_pulses;  //!< 总脉冲数
  uint32_t current_pulse; //!< 当前已输出脉冲数
  float    current_freq;  //!< 当前频率（Hz）
  float    V_min;         //!< 启动/停止速度（Hz）
  float    V_max;         //!< 最大速度（Hz）
  float    accel;         //!< 加速度（Hz/s2）
  float    accel_step;    //!< 加速度（Hz/s2）
  float    decel_step;    //!< 加速度（Hz/s2）
  uint8_t  state;         //!< 状态：0-加速，1-匀速，2-减速
  uint8_t  pto_run_type;  //!< 运行类型：0-加速|匀速|减速，1-固定频率
  /*以下为通用配置*/
  TIM_TypeDef*      TIMx;      //!< 定时器实例（如TIM1, TIM8等）
  TIM_HandleTypeDef htim;      //!< HAL库定时器句柄
  GPIO_TypeDef*     GPIO_Port; //!< GPIO端口（如GPIOA, GPIOB等）
  uint16_t          GPIO_Pin;  //!< GPIO引脚（如GPIO_PIN_1, GPIO_PIN_3等）
  uint8_t           GPIO_AF;   //!< GPIO复用功能选择（如GPIO_AF1_TIM2等）
  IRQn_Type         TIMx_IRQn; //!< 定时器中断号（如TIM1_IRQn, TIM8_IRQn等）
} PWM_CONF;
extern PWM_CONF pwm_conf_list[2];

void PWM_Init_all(void);
void PWM_ON(
    enum PWM_CH ch, uint8_t time_base, uint16_t pulse_width, uint32_t cycle_time, uint16_t start_pulse_w); // 启用pwm
Bool CTRL_PWM(Bool en, CTRL_PWM_S* instance);
void PWM_SetByFreqDuty(enum PWM_CH ch, float freq_hz, float duty_percent, uint16_t pulse_width_unit);
// todo 用到PTO再加吧
void PTO_ON(enum PWM_CH ch); // 启用pto
Bool CTRL_PTO(Bool en, CTRL_PTO_S* instance, uint32_t total_pulses);
#endif
